首先定义链表

    class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }

1.单链表反转,将一个链表反转过来,例如 1 》8》5》4 反转后变成4》5》8》1.
可采取两个指针,一次遍历的方法实现,java代码如下

    public ListNode reverse(ListNode l1) {
        ListNode prev = null;
        ListNode next;
        while (l1 != null) {
            next = l1.next;
            l1.next = prev;
            prev = l1;
            l1 = next;
        }
        return prev;
    }

思路:当 l1将next指向prev时,会导致后面的链表信息丢失,需要用一个指针来保存后面信息,相当于prev this next,三个指针形成的窗口在移动,一开始将prev置为null也是方便代码书写不用对第一个元素进行特殊判断,总体思路就是在遍历链表的同时进行反转操作,时间复杂度o(n),空间复杂度o(1)

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

示例:

输入:1->3->5, 1->2->4
输出:1->1->2->3->4->5

可每次比较两个链表中的第一个元素,小的链表往后移动,java代码如下:

   public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode preHead = new ListNode(-1);
        ListNode prev = preHead;
        while(l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                prev.next = l1;
                l1 = l1.next;
            } else {
                prev.next = l2;
                l2 = l2.next;
            }
            prev = prev.next;
        }
        prev.next = l1 != null ? l1 : l2;
        return preHead.next;
    }

思路:设置一个哨兵节点方便返回链表头部也方便代码书写不用对第一次比较情况做特殊判断,然后设置一个指针prev根据每次对比的结果进行移动,时间复杂度o(n+m),空间复杂度o(1)