首页 > 其他分享 >3622、合并两个有序链表

3622、合并两个有序链表

时间:2023-02-14 14:35:15浏览次数:32  
标签:ListNode cur 3622 list1 list2 链表 有序 new

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。



示例 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 均按 非递减顺序 排列


来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.linkedlist;

/**

* 21. 合并两个有序链表 <br/>将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

* 力扣

*

* @author [email protected]

*

* 2022-2-18

*/

public class MergeTwoSortedLists {

/* 输入:l1 = [1,2,4], l2 = [1,3,4]

输出:[1,1,2,3,4,4]

示例 2:



输入:l1 = [], l2 = []

输出:[]

示例 3:



输入:l1 = [], l2 = [0]

输出:[0]

*/

// l1 和 l2 均按 非递减顺序 排列

/**

* 同MergeSortedArray的思路一样,代码结构基本一样。由于链表和数组的特点不同,语法方法上有所差异,核心不同点:4行代码。

*

* @param list1

* @param list2

* @return

*/

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {

// 虚拟1个头结点,方便操作

ListNode head = new ListNode();

ListNode cur = head;

while (list1 != null && list2 != null) {

int val1 = list1.val;

int val2 = list2.val;

if (val1 <= val2) {

// 记录当前节点的下一个节点

ListNode next1 = list1.next;

// 全局当前节点

cur.next = list1;

// 遍历下一个节点

list1 = next1;

cur = cur.next;

} else {

// 记录当前节点的下一个节点

ListNode next2 = list2.next;

// 全局当前节点

cur.next = list2;

// 遍历下一个节点

list2 = next2;

cur = cur.next;

}

}

//todo:可以优化 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可

// list1有剩余的

while (list1 != null) {

//务必先临时记录下一个节点,有点“swap交换的味道”

ListNode next1 = list1.next;

cur.next = list1;

list1 = next1;

cur = cur.next;

}

// list2有剩余的

while (list2 != null) {

ListNode next2 = list2.next;

cur.next = list2;

list2 = next2;

cur = cur.next;

}

return head.next;

}

}
package test.leecode.linkedlist;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.linkedlist.ListNode;

import cn.fansunion.leecode.linkedlist.MergeTwoSortedLists;

/**

* @author [email protected]

*

* 2022-2-23

*/

public class MergeTwoSortedListsTest {

// 1245+137=1123457

@Test

public void test1245Plus137() {

MergeTwoSortedLists test = new MergeTwoSortedLists();

ListNode node5 = new ListNode(5, null);

ListNode node4 = new ListNode(4, node5);

ListNode node2 = new ListNode(2, node4);

ListNode list1 = new ListNode(1, node2);

ListNode node7 = new ListNode(7, null);

ListNode node3 = new ListNode(3, node7);

ListNode list2 = new ListNode(1, node3);

ListNode merge1 = test.mergeTwoLists(list1, list2);

int[] merge1Val = merge1.curNextValArray();

Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 4, 5, 7}, merge1Val);

}

// 124+137=112347

@Test

public void test124Plus137() {

MergeTwoSortedLists test = new MergeTwoSortedLists();

ListNode node4 = new ListNode(4, null);

ListNode node2 = new ListNode(2, node4);

ListNode list1 = new ListNode(1, node2);

ListNode node7 = new ListNode(7, null);

ListNode node3 = new ListNode(3, node7);

ListNode list2 = new ListNode(1, node3);

ListNode merge1 = test.mergeTwoLists(list1, list2);

int[] merge1Val = merge1.curNextValArray();

Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 4, 7}, merge1Val);

}

// 124+1378=1123478

@Test

public void test124Plus1378() {

MergeTwoSortedLists test = new MergeTwoSortedLists();

ListNode node4 = new ListNode(4, null);

ListNode node2 = new ListNode(2, node4);

ListNode list1 = new ListNode(1, node2);

ListNode node8 = new ListNode(8, null);

ListNode node7 = new ListNode(7, node8);

ListNode node3 = new ListNode(3, node7);

ListNode list2 = new ListNode(1, node3);

ListNode merge1 = test.mergeTwoLists(list1, list2);

int[] merge1Val = merge1.curNextValArray();

Assert.assertArrayEquals(new int[] {1, 1, 2, 3, 4, 7, 8}, merge1Val);

}

}

标签:ListNode,cur,3622,list1,list2,链表,有序,new
From: https://blog.51cto.com/fansunion/6056786

相关文章

  • 3623、合并两个有序数组
    给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非......
  • 顺序表应用5:有序顺序表归并(SDUT 3329)
    ProblemDescription已知顺序表A与B是两个有序的顺序表,其中存放的数据元素皆为普通整型,将A与B表归并为C表,要求C表包含了A、B表里所有元素,并且C表仍然保持有序。Input......
  • 顺序表应用6:有序顺序表查询(SDUT 3330)
    ProblemDescription顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序......
  • 数据结构实验之链表一:顺序建立链表(SDUT 2116)
    ProblemDescription输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。Input第一行输入整数的个数N;第二行依次输入每个整数。Output输出这组整......
  • 数据结构实验之链表二:逆序建立链表(SDUT 2117)
    ​​题目链接​​#include<bits/stdc++.h>usingnamespacestd;structnode{intdata;structnode*next;};intmain(){intn;structnode*head,*p;h......
  • 88. 合并两个有序数组
    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合......
  • leetcode:合并2个有序链表-easy
    题目:将两个升序链表合并为一个新的升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,......
  • 反转链表
    给你单链表的头节点head,请你反转链表,并返回反转后的链表 输入:head=[1,2,3,4,5]输出:[5,4,3,2,1] tips:链表中节点数的数目范围[0,5000]-5000<=Node.val<......
  • lc26删除有序数组中的重复项
    classSolution{publicintremoveDuplicates(int[]nums){if(nums.length==0){return0;}intslow=0,fast=0;......
  • LeetCode-83. 删除排序链表中的重复元素(java)
    一、前言:......