思路
题目链接:合并两个有序链表
题目中给的链表是不带头结点的,这点需要注意。
首先建立一个带头结点的空链表ans,再建立一个指向ans的指针k。随后遍历list1和list2,每次将其中较小元素放入ans中。当遍历完其中一个链表时,将另一个链表的元素都放入ans中。
最后需要注意,ans是带头结点的,而题目需要我们返回不带头结点的链表。所以最后返回ans.Next
Golang代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
ans := new(ListNode)
i := list1
j := list2
k := ans
for i != nil && j != nil {
k.Next = new(ListNode)
k = k.Next
if i.Val < j.Val {
k.Val = i.Val
i = i.Next
} else {
k.Val = j.Val
j = j.Next
}
}
for i != nil {
k.Next = new(ListNode)
k = k.Next
k.Val = i.Val
i = i.Next
}
for j != nil {
k.Next = new(ListNode)
k = k.Next
k.Val = j.Val
j = j.Next
}
return ans.Next
}
C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution{
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2){
ListNode newHead(0);
ListNode *pi = &newHead;
while(l1 && l2){
if(l1->val > l2->val)
swap(l1, l2);
pi->next = l1;
l1 = l1->next;
pi = pi->next;
}
pi->next = l1 ? l1 : l2;
return newHead.next;
}
};