LeetCode演算法題21:合併兩個有序連結串列解析
阿新 • • 發佈:2018-11-02
將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
因為之前做過兩數之和的那道題,所以一開始並沒有審清楚題,這個題的後一句提示很重要,是直接拼接兩個連結串列的所有節點,也就是說其實不需要建立新的連結串列,只需要對這兩個連結串列進行排序即可。所以思路就是重新對連結串列的next進行排序即可,這裡同樣可以使用一個啞節點來開頭,然後只需要返回啞節點的下一個節點就可以。對兩個連結串列都不為空的情況比較其值大小,然後將節點指向小的節點,然後小節點指向下一個節點。如果有一個表空了,那就直接將下一個節點指向非空連結串列的當前節點。
C++原始碼:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode * l3 = new ListNode(0);
//ListNode l3(0);
ListNode * curr = l3;
while(l1!=NULL&&l2!=NULL)
{
if(l1->val>l2->val)
{
curr->next = l2;
l2 = l2->next;
}
else
{
curr->next = l1;
l1 = l1->next;
}
curr = curr->next;
}
if (l1!=NULL)
curr->next = l1;
if (l2!=NULL)
curr->next = l2;
return l3->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, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l3 = ListNode(0)
p, q, curr = l1, l2, l3
while p!=None and q!=None:
if p.val > q.val:
curr.next = q
q = q.next
else:
curr.next = p
p = p.next
curr = curr.next
if p != None:
curr.next = p
if q != None:
curr.next = q
return l3.next