1 題目描述
輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的節點仍然是遞增排序的。
示例1:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
限制:
0 <= 鏈表長度 <= 1000
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法:雙指針+僞節點
根據題目描述, 鏈表 l1, l2 是 遞增 的,因此容易想到使用雙指針 l1 和 l2遍歷兩鏈表,根據 l1 .val 和 l2 .val 的大小關係確定節點添加順序,兩節點指針交替前進,直至遍歷完畢。
引入僞頭節點: 由於初始狀態合併鏈表中無節點,因此循環第一輪時無法將節點添加到合併鏈表中。解決方案:初始化一個輔助節點 dum 作爲合併鏈表的僞頭節點,將各節點添加至 dum 之後。
作者:jyd
鏈接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/solution/mian-shi-ti-25-he-bing-liang-ge-pai-xu-de-lian-b-2/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
3 解決代碼
- 方法:雙指針+僞節點《Java代碼》
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// ListNode dum = new ListNode(0);
// ListNode cur = dum;
ListNode dum = new ListNode(0), cur = dum;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}
else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
//如果l1不爲空返回l1,否則返回l2
cur.next = l1 != null ?l1:l2;
return dum.next;
}
}
- 方法:雙指針+僞節點《python3 代碼》
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
cur = dum = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
if not l1:
cur.next = l2
else:
cur.next = l1
#cur.next = l1 if l1 else l2
return dum.next