I have implemented a simple version of singly linked list based on Java's LinkedList only to support this concat function. For simplicity, it only implements Iterable instead of List:
Java implementation:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class SimpleLinkedList<E> implements Iterable<E> {
    Node<E> first;
    Node<E> last;
    static class Node<E> {
        E item;
        Node<E> next;
        Node(E item, Node<E> next) {
            this.item = item;
            this.next = next;
        }
    }
    static class NodeIterator<E> implements Iterator<E> {
        private Node<E> node;
        NodeIterator(Node<E> node) {
            this.node = node;
        }
        public boolean hasNext() {
            return node != null;
        }
        public E next() {
            Node<E> currentNode = node;
            if (currentNode == null) throw new NoSuchElementException();
            node = currentNode.next;
            return currentNode.item;
        }
    }
    public Iterator<E> iterator() {
        return new NodeIterator<>(first);
    }
    public void add(E element) {
        // Copied from java.util.LinkedList
        Node l = last;
        Node<E> newNode = new Node<>(element, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
    }
    public void concatWith(SimpleLinkedList other) {
        if (last != null) last.next = other.first;
        else first = other.first;
        if (other.last != null) last = other.last;
    }
}
Kotlin implementation:
class SimpleLinkedList<E> : Iterable<E> {
    var first: Node<E>? = null
    var last: Node<E>? = null
    class Node<E>(var item: E, var next: Node<E>? = null)
    class NodeIterator<E>(var node: Node<E>?) : Iterator<E> {
        override fun hasNext(): Boolean = node != null
        override fun next(): E {
            val currentNode = node
            if (currentNode === null) throw NoSuchElementException()
            node = currentNode.next
            return currentNode.item
        }
    }
    override fun iterator(): Iterator<E> = NodeIterator(first)
    fun add(element: E) {
        // Copied from java.util.LinkedList
        val l = last
        val newNode = Node(element, null)
        last = newNode
        if (l == null)
            first = newNode
        else
            l.next = newNode
    }
    infix fun concatWith(other: SimpleLinkedList<E>) {
        last.run {
            if (this !== null) next = other.first
            else first = other.first
        }
        other.last?.let { last = it }
    }
}
The Kotlin implementation is actually a little bit slower than the Java one because getters and setters are used to access properties.