题目
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
题目结束
思路
1.旧链表是有序的,因此比较他们第一个,将较小节点给新链表。
2.然后对应较小节点的旧链表读取下一个节点。
3.重复1和2,直到旧链表中有一个结束。
详细代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
if(l1 == NULL & &l2 == NULL) return NULL;
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
struct ListNode *l3,*head;//l3是新链表。head是l3的头节点。(必须记录)
l3 = l1->val < l2->val? l1 : l2;//比较
head = l3;//记录头节点
if(l1->val < l2->val) l1=l1->next;//旧链表下一个节点
else l2=l2->next;
while(l1 != NULL&&l2 != NULL)//直到有个链表指向NULL
{
if(l1->val < l2->val)
{
l3->next = l1;
l1 = l1->next;
}
else
{
l3->next = l2;
l2 = l2->next;
}
l3 = l3->next;
}
if(l1!=NULL)//把有可能未结束(比较)的链表接到 l3 后面
{
l3 -> next = l1;
}
if(l2!=NULL)
{
l3 -> next = l2;
}
return head;//返回头结点
}