成武县建设局网站,全国工商信息企业查询官网,怎么下载网站页面,做苗木网站哪家好#x1f428;目录#x1f4d1;1. 题目#x1f6f6;2. 解法- 头插到新链表#x1f42c;2.1 思路#x1f42c;2.1 代码实现⛵3. 解法优化 - 带哨兵位#x1f40b;3.1 思路#x1f40b;3.2 代码实现#x1f6a4;4. 题目链接#x1f4d1;1. 题目
将两个升序链表合并为一个… 目录1. 题目2. 解法- 头插到新链表2.1 思路2.1 代码实现⛵3. 解法优化 - 带哨兵位3.1 思路3.2 代码实现4. 题目链接1. 题目
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例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 100l1 和 l2 均按非递减顺序排列
2. 解法- 头插到新链表
2.1 思路
题目给我们的链表是升序的最简单直接的思路就是将这两个链表尾插升序排列到一个新链表。 tips 这里我们需要考虑到题目给的两个链表是否为空尾插时也需判断我们的新链表是否为空最后需检查两个链表是否遍历完毕如果未遍历完毕则将剩余的元素直接尾插到新链表。 2.1 代码实现
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){if(list1 NULL)return list2;if(list2 NULL)return list1;struct ListNode*newhead NULL,*tail NULL;while(list1list2){if(list1-val list2-val){if(tail NULL){newhead tail list1;}else{//尾插tail-next list1;tail tail-next;}list1 list1-next;}else{if(tail NULL){newhead tail list2;}else{//尾插tail-next list2;tail tail-next;}list2 list2-next;}}if(list1tail){tail-next list1;tail tail-next;}if(list2tail){tail-next list2;tail tail-next;}return newhead;
}⛵3. 解法优化 - 带哨兵位
3.1 思路
刚才的解法需要链表进行判断是否为空那么如果放置一个带哨兵位的头节点guard那我们就不需要进行判空了直接往tail后面尾插就行了。 tips 这里不能直接返回guard而是要返回guard的下一个节点因为guard并未存储任何有效数据只负责在这里 “站哨” 因为这里的哨兵位是我们向内存申请的空间使用完毕之后还需要进行释放。 3.2 代码实现
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode*guard NULL;struct ListNode*tail NULL;//哨兵位guard tail (struct ListNode*)malloc(sizeof(struct ListNode));tail-next NULL;while(list1 list2){if(list1-val list2-val){tail-next list1;tail tail-next;list1 list1-next;}else{tail-next list2;tail tail-next;list2 list2-next; }}if(list1)tail-next list1;if(list2)tail-next list2;struct ListNode*head guard-next;free(guard);return head;
}4. 题目链接
leetcode——21. 合并两个有序链表