【链表】合并两个有序链表
2020-10-24 本文已影响0人
修行者12138
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
思路一(耗时1ms,超过60%)
创建一个新的链表3,每次遍历链表1和链表2,都创建一个新节点,值为链表1和链表2的当前节点中较小值,把新节点插入链表3
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 任意一个链表为空,则返回另一个
if (null == l1 || null == l2) {
return null == l1 ? l2 : l1;
}
ListNode head = new ListNode();
ListNode point = head;
while (null != l1 && null != l2) {
// 值相等的时候优先取l1
if (l1.val > l2.val) {
point.val = l2.val;
l2 = l2.next;
} else {
point.val = l1.val;
l1 = l1.next;
}
point.next = new ListNode();
point = point.next;
}
if (null != l1) {
point.val = l1.val;
point.next = l1.next;
} else if (null != l2) {
point.val = l2.val;
point.next = l2.next;
} else {
point = null;
}
return head;
}
思路二(耗时0ms,超过100%)
不用创建新的链表,只需创建几个节点指针,遍历链表1和链表2,每次把指针指向较小的节点
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 任意一个链表为空,则返回另一个
if (null == l1 || null == l2) {
return null == l1 ? l2 : l1;
}
ListNode head = null;
ListNode point = null;
while (null != l1 && null != l2) {
// 临时节点
ListNode temp;
// 值相等的时候优先取l1
if (l1.val <= l2.val) {
temp = l1;
l1 = l1.next;
} else {
temp = l2;
l2 = l2.next;
}
if (null == head) {
point = temp;
head = point;
} else {
point.next = temp;
point = point.next;
}
}
// 把l1和l2剩余部分拼接到point后面
if (null != l1) {
point.next = l1;
} else if (null != l2) {
point.next = l2;
}
return head;
}
image.png
如果题目有说明要保证输入链表的稳定性,即不能破坏原链表的结构,就只能用思路一