赞
踩
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。,l1 和 l2 均按 非递减顺序排列
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
题中要求的是新链表是通过拼接完成两个链表的合并的,因此不需要创建新的结点,只需要定义头尾指针即可,头指针用来标记新链表开头,用来做返回值;尾指针用来向后更新新链表的,每次都将l1和l2的val做比较,尾指针每次都指向较小的值,然后向后走,直到l1或l2走到NULL为止。
初始情况:
①刚开始(当newHead为NULL时),首先比较 l1->val 和 l2->val 的大小,小的值用来做新链表的头(如果相等,则l2向后走)
②当newHead不为NULL时,再次比较 l1->val 和 l2->val 的大小,使newTail->next指向较小的值,然后再更新 l1 或 l2 指针的位置(向后走一个)
③循环步骤②,直至 l1 或 l2 全部走完
④当 l1 或 l2 有一方为NULL时,将不为NULL的那一方连接到newTail的后面即可(不需要再走newTail)
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ //新链表的头尾指针 struct ListNode* newHead = NULL; struct ListNode* newTail = NULL; if(l1 == NULL){ return l2; } if(l2 == NULL) { return l1; } //确定第一个结点,头尾指针 if(l1->val < l2->val) { newHead = newTail = l1; l1 = l1->next; }else { newHead = newTail = l2; l2 = l2->next; } while(l1 && l2) { if(l1->val < l2->val) { newTail->next = l1; newTail = l1; l1 = l1->next; } else{ newTail->next = l2; newTail = l2; l2 = l2->next; } } if(l1){ newTail->next = l1; } if(l2) { newTail->next = l2; } return newHead; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。