剑指Offer 链表相关问题--从尾到头打印链表、合并两个排序的链表

面试题5:从尾到头打印链表

题目描述:

输入一个链表,从尾到头打印链表每个节点的值。

题目解析:
方法一:先遍历链表,将每个节点push进栈中,然后再依次弹出。即实现逆序输出
方法二:通过递归的方式(但要考虑链表过长,递归层次过深的情况)
方法三:反转链表,然后遍历输出(不建议采用)

代码:
方法一:

/**
 *    public class ListNode {
 *        int val;
 *        ListNode next = null;
 *
 *        ListNode(int val) {
 *            this.val = val;
 *        }
 *    }
 *
 */
    import java.util.ArrayList;
    import java.util.Stack;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> result = new ArrayList<>();
            if (listNode == null)
                return result;
            Stack<ListNode> stack = new Stack<ListNode>();

            while (listNode != null) {
                stack.push(listNode);
                listNode = listNode.next;
            }

            // 输出结果
            while (!stack.isEmpty()) {
                result.add(stack.pop().val);
            }
            return result;
        }
    }

方法二:

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> result = new ArrayList<>();
        printList(listNode, result);
        return result;
    }

    private void printList(ListNode node, ArrayList<Integer> result) {
        if (node != null) {
            printList(node.next, result);
            result.add(node.val);
        }
    }
}

方法三:反转链表

剑指Offer-题16 反转链表(Java)


面试题17 合并两个排序的链表

问题描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

问题分析:
简单比较尾插法即可;

代码:
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode head = new ListNode(0);
        ListNode tempList = head;
        while (list1 != null && list2 != null) {

            if (list1.val < list2.val) {
                tempList.next = list1;
                list1 = list1.next;
            } else {
                tempList.next = list2;
                list2 = list2.next;
            }
            tempList = tempList.next;
        }

        if (list1 != null)
            tempList.next = list1;
        if (list2 != null)
            tempList.next = list2;
        return head.next;
    }
}




你可能感兴趣的:(剑指Offer 链表相关问题--从尾到头打印链表、合并两个排序的链表)