难度简单1796收藏分享切换为英文接收动态反馈
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
------------------------------分割线----------------------------------
思路:找出首节点值最小的链表(最终是输出这个链表),然后每个链表指针一直遍历,通过比较值,将值插入输出链表中,注意各种情况:
1.A链表为空,B链表不为空
2.A聊表不为空,B链表为空
3.空节点之前插入。。。
等
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode*l1_head;
struct ListNode*l2_head;
struct ListNode*p1;
struct ListNode*p2;
struct ListNode*ret;
struct ListNode*tmp;
struct ListNode*pre;
int done_flg=0;
l1_head = (struct ListNode*)malloc(sizeof(struct ListNode));
l2_head = (struct ListNode*)malloc(sizeof(struct ListNode));
l1_head->next = l1;
l2_head->next = l2;
if(l1_head->next==NULL)
return l2_head->next;
if(l2_head->next==NULL)
return l1_head->next;
p1=l1_head->next;
p2=l2_head->next;
if(l1_head->next->val > l2_head->next->val){
p1=l2_head->next;
p2=l1_head->next;
}
ret = p1;
pre = p1;
while(p1!=NULL)
{
while(p2!=NULL){
if(p2->val >= p1->val){
if(p1->next==NULL){
p1->next = p2;
done_flg = 1;
}
break;
}
//小于链表1;
if((p2->val >= pre->val) && (p2->val < p1->val))
{
tmp = p2->next;
pre->next = p2;
p2->next = p1;
p1 = p2;
p2 = tmp;
continue;
}
p2=p2->next;
}
if(done_flg==1)
break;
pre = p1;
p1=p1->next;
}
return ret;
}